<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    const arr = [1, 2, 3, 4, 5];

    for (const item of arr) {
        console.log(item);
    }
    console.log(Array.prototype[Symbol.iterator]);

    console.log('=========================');


    /* 自己伪造一个类数组  1. 下标0-长度-1 2. 长度 */

    const likeArr = {
        0: 12,
        1: 24,
        2: 38,
        3: 46,
        4: 15,
        length: 5,
        /* 自己去给对象增加一个  Symbol.iterator，属性的值我们借用 数组的 Array.prototype[Symbol.iterator] */
        /* 是否可以自己去写一个 对象的 for of 遍历，通过刚才借用我们发现，只要对象有 Symbol.iterator 属性， 可以实现遍历 */
        // [Symbol.iterator]: Array.prototype[Symbol.iterator]
        [Symbol.iterator]() {
            // 方法要返回一个对象
            let index = 0; // 索引值作为对象下标属性 
            // let self = this;
            return {
                next: () => {
                    /* next 方法的返回值是一个对象 ，
                    1. 对象的 done 属性是用于标识是否 遍历完成了，true代表遍历完成；false 还没有
                    2. 对象的 value 属性是用于存储遍历的值
                     */
                    if (index < this.length) {
                        return {
                            done: false, // 代表遍历还没有完成
                            value: {
                                index,
                                value: this[index++]
                            }, // 通过下标索引获取对象的值
                        }
                    } else {
                        return {
                            done: true,
                            value: undefined,
                        }
                    }
                }
            }
        }
    }

    console.log('likeArr', likeArr);

    /* likeArr is not iterable */
    for (const item of likeArr) {
        console.log(item);
    }


</script>

</html>